package com.cdhong.shop.backend.controller;


import com.auth0.jwt.interfaces.DecodedJWT;
import com.cdhong.shop.backend.entity.Admin;
import com.cdhong.shop.backend.entity.ResponseEntity;
import com.cdhong.shop.backend.service.IAdminService;
import com.cdhong.shop.backend.util.FileUtil;
import com.cdhong.shop.backend.util.JWTUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;


/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author CDHong
 * @since 2024-04-17
 */
@CrossOrigin
@RestController
@RequestMapping("/admin")
public class AdminController {
    private enum FileType {
        ADMIN_AVATAR("admin_avatar"), // 管理员头像
        CATEGORY_PICTURE("category_picture"), // 分类图
        GOODS_PICTURE("goods_picture"), // 商品图
        GOODS_ALBUM("goods_album"), // 商品轮播图
        GOODS_DESCRIPTION("goods_description"); // 商品描述图

        final String fileType;

        FileType(String fileType) {
            this.fileType = fileType;
        }
    }

    @Autowired
    private IAdminService adminService;

    /**
     * 管理员登录
     *
     * @param user 用户名和密码
     * @return 返回是否登录成功
     */
    @PostMapping("login")
    public ResponseEntity login(@RequestBody Admin user) {
        // 根据用户名查询对应的盐
        String salt = adminService.lambdaQuery()
                .eq(Admin::getUsername, user.getUsername())
                .one()
                .getSalt();

        // 根据盐进行密码加密
        String md5HexPassword = DigestUtils.md5Hex(user.getPassword() + salt);
        // 登录验证
        Admin admin = adminService.lambdaQuery()
                .eq(Admin::getUsername, user.getUsername())
                .eq(Admin::getPassword, md5HexPassword)
                .one();
        if (Objects.nonNull(admin)) {
            // 组装Token数据
            Map<String, String> data = new HashMap<>();
            data.put("username", admin.getUsername());
            data.put("id", admin.getId().toString());
            // 生成Token
            String token = JWTUtil.getToken(data);
            return ResponseEntity.ok("用户登录成功！！", token);
        }
        return ResponseEntity.error("用户名或密码输入有误！！");
    }

    /**
     * 获取管理员信息
     *
     * @return 返回管理员基本信息
     * @Param token 获取请求头中的Token
     */
    @GetMapping("info")
    public ResponseEntity getAdminInfo(@RequestHeader(value = "token", required = false) String token) {
        // 根据Head中的token获取当前登录的用户id
        DecodedJWT verify = JWTUtil.verify(token);
        // verify.getClaims().forEach((k,v)->System.out.println(k+"---"+v.asString()));
        String userId = verify.getClaim("id").asString();
        // String username = verify.getClaim("username").asString();
        // 根据用户ID获取当前用户信息
        Admin admin = adminService.lambdaQuery().eq(Admin::getId, userId).one();
        return ResponseEntity.data(admin);
    }

    /**
     * 文件上传
     * @param file 文件对象
     * @param type 图片类型：
     *             - `admin_avatar` 管理员头像
     *             - `category_picture` 分类图
     *             - `goods_picture` 商品图
     *             - `goods_album` 商品轮播图
     *             - `goods_description` 商品描述图
     * @return 返回文件保存地址
     */
    @PostMapping("upload")
    public @ResponseBody
    ResponseEntity upload(MultipartFile file, String type){
        String filePath = FileUtil.fileUpload(file, type);
        if(Objects.isNull(filePath)){
            return ResponseEntity.error("上传失败！！");
        }
        // 返回内容
        Map<String,String> map = new HashMap<>();
        map.put("image",filePath);
        return ResponseEntity.data("上传成功！！",map);
    }

    /**
     * 修改头像
     * @param token 会话对象
     * @param map 头像地址
     * @return 返回是否修改成功
     */
    @PostMapping("changeAvatar")
    public ResponseEntity changeAvatar(@RequestHeader(value = "token", required = false) String token,
                                       @RequestBody Map<String,String> map) throws Exception {
        // 获取Token中的用户ID
        DecodedJWT verify = JWTUtil.verify(token);
        String userId = verify.getClaim("id").asString();

        // 修改头像
        boolean flg = adminService.lambdaUpdate()
                .set(Admin::getAvatar, map.get("avatar"))
                .eq(Admin::getId, userId)
                .update();
        if (flg){
            return ResponseEntity.ok("修改头像成功!!");
        }
        return ResponseEntity.error("修改头像失败!!");

    }


    /**
     * 修改管理员密码
     * @param token Token值
     * @param map   密码-->前端JSON对象，map进行接收
     * @return 返回是否修改成功
     */
    @PostMapping("changePassword")
    public ResponseEntity changePassword(@RequestHeader(value = "token", required = false) String token,
                                         @RequestBody Map<String, String> map) {
        // 获取Token中的用户ID
        DecodedJWT verify = JWTUtil.verify(token);
        String userId = verify.getClaim("id").asString();
        // 根据用户ID查询对应的用户信息
        Admin admin = adminService.lambdaQuery().eq(Admin::getId, userId).one();
        // 根据传入的密码和查询的盐生成MD5密码进行替换修改
        admin.setPassword(DigestUtils.md5Hex(map.get("password") + admin.getSalt()));
        boolean flg = adminService.updateById(admin);
        if (flg) {
            return ResponseEntity.ok("修改密码成功！！");
        }
        return ResponseEntity.error("修改密码失败！！");
    }

}
